home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
seyon
/
SeScript.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-03
|
9KB
|
585 lines
/*
* This file is part of the Seyon, Copyright (c) 1992-1993 by Muhammad M.
* Saggaf. All rights reserved.
*
* See the file COPYING (1-COPYING) or the manual page seyon(1) for a full
* statement of rights and permissions for this program.
*/
#include <time.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include "seyon.h"
#include "SeDecl.h"
#ifdef SUNOS_3
#include <setjmp.h>
#endif
#define MAX_PATH 256
#define MAX_LINE 128
extern int MdmTimedReadChar();
extern FILE *tfp;
extern char scriptDirectory[REG_BUF];
static FILE *cf;
int waitfor_time = 0,
if_flag = 0,
waitflag = 0;
Boolean tty_flag = True,
echo_flag = False,
captflag = True;
jmp_buf here;
void k_debug(),
k_echo(),
k_flush(),
k_hangup(),
k_purge(),
k_send_break(),
k_shell(),
k_waitfor(),
k_when(),
k_transmit(),
k_pause(),
k_exit(),
k_quit(),
k_if(),
k_goto(),
k_else(),
k_endif(),
k_redial(),
k_dial(),
s_set(),
k_tty(),
k_capture();
/* globals */
int linkflag = 0;
static struct kw kw[] =
{
{"debug", k_debug},
{"echo", k_echo},
{"flush", k_flush},
{"hangup", k_hangup},
{"purge", k_purge},
{"send_break", k_send_break},
{"shell", k_shell},
{"waitfor", k_waitfor},
{"when", k_when},
{"transmit", k_transmit},
{"pause", k_pause},
{"exit", k_exit},
{"if", k_if},
{"else", k_else},
{"endif", k_endif},
{"goto", k_goto},
{"dial", k_dial},
{"redial", k_redial},
{"quit", k_quit},
{"set", s_set},
{"capture", k_capture},
{"tty", k_tty},
{NULL, NULL}};
Boolean
do_script(scriptFileName)
String scriptFileName;
{
char *scriptDir,
buf[REG_BUF];
FILE *scriptFP;
if (qres.scriptDirectory) scriptDir = qres.scriptDirectory;
else scriptDir = qres.defaultDirectory;
strcpy(buf, scriptFileName);
if ((scriptFP = open_file(buf, scriptDir)) == NULL)
return False;
exec_close_script(scriptFP);
return True;
}
void
exec_close_script(script_fp)
FILE *script_fp;
{
if_flag = 0;
echo_flag = False;
captflag = False;
tty_flag = True;
eof_flag = 0;
if (linkflag == 2)
linkflag = 0;
while (!eof_flag)
get_line(script_fp);
fclose(script_fp);
if (captflag)
fclose(cf);
eof_flag = 0;
lptr = strcpy(line, "");
k_when();
linkflag = 0;
return;
}
static char wf[MAX_LINE];
void
get_line(script_fp)
FILE *script_fp;
{
int i;
getline(script_fp);
if (eof_flag)
return;
getword();
if (echo_flag) {
if (strcmp(word, "transmit"))
show(line);
else
show("TRANSMIT...");
}
if (word[0] == '\0') /* Ignore blank lines */
return;
if (word[0] == '#') /* Ignore comments */
return;
if (word[strlen(word) - 1] == ':') /* Ignore labels */
return;
if (if_flag == -1) {
if (strcmp(word, "else") && strcmp(word, "endif"))
return;
}
for (i = 0; kw[i].keyword != NULL; i++)
if (strcmp(kw[i].keyword, word) == 0) {
(*kw[i].rtn) (script_fp);
return;
}
fprintf(tfp, "UNDEFINED COMMAND: \"%s\"\r\n", word);
eof_flag = 1;
return;
}
struct _when {
String expect;
String send;
String ptr;
};
struct _when when[MAX_ENT] =
{
{NULL, NULL, NULL}};
void
k_waitfor()
{
long t;
char *ptr = wf, c;
struct _when *whenPtr;
GETTEST_ARG("waitfor");
strcpy(wf, word);
GET_ARG();
for (whenPtr = when; whenPtr->expect; whenPtr++)
whenPtr->ptr = whenPtr->expect;
if (word[0])
waitfor_time = atoi(word);
else
waitfor_time = 30;
t = time(NULL) + waitfor_time;
while (t != time(NULL) && !eof_flag) {
if (MdmTimedReadChar(&c, 1) < 0)
continue;
if (tty_flag)
fputc(c, tfp);
if (captflag)
fputc(c, cf);
if ((char)c != *ptr)
ptr = wf;
else if (*++ptr == '\0') {
waitflag = 1;
return;
}
for (whenPtr = when; whenPtr->expect; whenPtr++) {
if ((char)c != *(whenPtr->ptr))
whenPtr->ptr = whenPtr->expect;
else if (*++(whenPtr->ptr) == '\0')
MdmPutString(whenPtr->send);
}
}
waitflag = 0;
}
void
k_when()
{
struct _when *whenPtr;
GET_ARG();
if (word[0] == '\0') {
for (whenPtr = when; whenPtr->expect; whenPtr++) {
XtFree(whenPtr->expect);
XtFree(whenPtr->send);
}
when[0].expect = NULL;
return;
}
for (whenPtr = when; whenPtr->expect; whenPtr++);
whenPtr->expect = XtNewString(word);
(whenPtr + 1)->expect = NULL;
GETTEST_ARG("when");
whenPtr->send = XtNewString(word);
}
void
k_transmit()
{
getword();
if (eof_flag)
return;
if (word[0] == '\0') {
fprintf(tfp, "No argument to TRANSMIT command\r\n");
eof_flag = 1;
return;
}
MdmPutString(word);
}
void
k_pause()
{
int pause_time;
getword();
if (eof_flag)
return;
if (word[0] == '\0')
pause_time = 5;
else
pause_time = atoi(word);
sleep(pause_time);
}
void
k_quit()
{
write_child_info(child_pipe, EXIT_PROGRAM, "");
k_exit();
}
void
k_exit()
{
eof_flag = 1;
}
static char label[WBSIZE];
void
k_goto(script_fp)
FILE *script_fp;
{
int found = 0,
i;
getword();
if (word[0] == '\0') {
fprintf(tfp, "No argument for GOTO: %s\r\n", line);
eof_flag++;
return;
}
strcpy(label, word);
rewind(script_fp);
while (!found) {
getline(script_fp);
if (eof_flag)
break;
getword();
if (word[0] == '\0' || word[0] == '#')
continue;
if (word[i = (strlen(word) - 1)] != ':')
continue;
word[i] = '\0';
found = (strcmp(word, label) == 0);
}
if (eof_flag) {
fprintf(tfp, "Label %s not found\r\n", label);
eof_flag++;
return;
}
if_flag = 0; /* reset IF flag */
}
static if_negate = 0;
static int
if_test(cond)
int cond;
{
if (if_negate)
cond = !cond;
if (cond)
return 1;
else
return -1;
}
void
k_if()
{
char *ptr;
if (if_flag) {
fprintf(tfp, "Nested IF statements not allowed\r\n");
eof_flag++;
return;
}
if_negate = 0;
getword();
if (word[0] == '\0') {
fprintf(tfp, "No condition on IF statement\r\n");
eof_flag++;
return;
}
if (strcmp(word, "not") == 0) {
if_negate = 1;
getword();
if (word[0] == '\0') {
fprintf(tfp, "No condition on IF statement\r\n");
eof_flag++;
return;
}
}
if (word[0] == '!') {
if_negate = 1;
ptr = word + 1;
}
else
ptr = word;
if (strcmp(ptr, "waitfor") == 0) {
if_flag = if_test(waitflag);
return;
}
if (strcmp(ptr, "linked") == 0) {
if_flag = if_test(linkflag);
return;
}
fprintf(tfp, "Undefined IF condition %s\r\n", ptr);
eof_flag++;
return;
}
void
k_else()
{
if (!if_flag) {
fprintf(tfp, "ELSE not within IF\r\n");
eof_flag++;
return;
}
if_flag = -if_flag;
}
void
k_endif()
{
if (!if_flag) {
fprintf(tfp, "ENDIF not wihtin IF\r\n");
eof_flag++;
return;
}
if_flag = 0;
}
void
k_dial()
{
getword();
if (word[0] == '\0') {
fprintf(tfp, "DIAL command must have an argument\r\n");
eof_flag++;
return;
}
dial(word);
}
void
k_redial()
{
if (redial(NULL)) {
eof_flag++;
return;
}
}
void
k_debug()
{
set_onoff(&echo_flag);
return;
}
void
k_echo()
{
GET_ARG();
show(word);
}
void
k_flush()
{
MdmIFlush();
}
void
k_hangup()
{
MdmHangup();
}
void
k_purge()
{
MdmPurge();
}
void
k_send_break()
{
send_break();
}
void
k_shell()
{
GETTEST_ARG("shell");
ExecShellCommand(word, 0);
}
void
k_capture()
{
Boolean val = captflag;
set_onoff(&captflag);
if (eof_flag)
return;
if (val == captflag)
return;
if (captflag == False)
fclose(cf);
else {
if ((cf = fopen(captureFile, "a")) == NULL) {
fprintf(tfp, "Cannot open capture file %s\r\n", captureFile);
eof_flag++;
return;
}
}
}
void
k_tty()
{
set_onoff(&tty_flag);
return;
}
/*
* Dial a phone number, using proper format and delay.
*/
static char *last_nbr = NULL;
void
dial(s)
char *s;
{
if (last_nbr)
XtFree(last_nbr);
last_nbr = XtNewString(s);
mprintf("\r%s %s%s", qres.dialPrefix, s, qres.dialSuffix);
}
int
redial(last_nbr)
char *last_nbr;
{
char *s;
if (last_nbr == NULL) {
show("REDIAL FAILURE");
return 1;
}
s = XtNewString(last_nbr);
dial(s);
XtFree(s);
return 0;
}